package com.party.pay;

/**
 * @author: zhaoyongke
 * @create: 2025-09-01 15:31
 * @description: PayNotifyRequest
 */
import lombok.Data;
import java.util.HashMap;
import java.util.Map;

/**
 * 支付通知参数实体类
 */
@Data
public class PayNotifyRequest {
    // 必传参数
    private String payOrderId;       // 支付系统订单号
    private String mchNo;            // 商户号
    private String appId;            // 应用ID
    private String mchOrderNo;       // 商户订单号
    private String ifCode;           // 支付接口编码
    private String wayCode;          // 支付方式
    private int amount;              // 支付金额（分）
    private String currency;         // 货币代码（cny）
    private int state;               // 订单状态（2-支付成功）
    private String subject;          // 商品标题
    private String body;             // 商品描述
    private long createdAt;          // 订单创建时间（13位时间戳）
    private String reqTime;          // 通知请求时间（13位时间戳）
    private String sign;             // 签名值

    // 可选参数
    private String clientIp;         // 客户端IP
    private String channelOrderNo;   // 渠道订单号（如微信/支付宝的订单号）
    private String channelChannel;   // 实际支付渠道（WECHAT/ALIPAY等）
    private String errCode;          // 渠道错误码
    private String errMsg;           // 渠道错误描述
    private String extParam;         // 扩展参数（下单时传入的原样返回）
    private Long successTime;        // 支付成功时间（13位时间戳）

    /**
     * 转换为签名用的Map（排除sign字段，按ASCII排序）
     */
    public Map<String, String> toSignMap() {
        Map<String, String> map = new HashMap<>();
        map.put("payOrderId", payOrderId);
        map.put("mchNo", mchNo);
        map.put("appId", appId);
        map.put("mchOrderNo", mchOrderNo);
        map.put("ifCode", ifCode);
        map.put("wayCode", wayCode);
        map.put("amount", String.valueOf(amount));
        map.put("currency", currency);
        map.put("state", String.valueOf(state));
        map.put("subject", subject);
        map.put("body", body);
        map.put("createdAt", String.valueOf(createdAt));
        map.put("reqTime", reqTime);

        // 可选参数非空才加入
        if (clientIp != null && !clientIp.isEmpty()) {
            map.put("clientIp", clientIp);
        }
        if (channelOrderNo != null && !channelOrderNo.isEmpty()) {
            map.put("channelOrderNo", channelOrderNo);
        }
        if (channelChannel != null && !channelChannel.isEmpty()) {
            map.put("channelChannel", channelChannel);
        }
        if (errCode != null && !errCode.isEmpty()) {
            map.put("errCode", errCode);
        }
        if (errMsg != null && !errMsg.isEmpty()) {
            map.put("errMsg", errMsg);
        }
        if (extParam != null && !extParam.isEmpty()) {
            map.put("extParam", extParam);
        }
        if (successTime != null) {
            map.put("successTime", String.valueOf(successTime));
        }
        return map;
    }
}
